package com.example.luckysystem.service.impl;

import com.example.luckysystem.common.errorcode.ServiceErrorCodeConstants;
import com.example.luckysystem.common.exception.ServiceException;
import com.example.luckysystem.common.util.*;
import com.example.luckysystem.service.VerificationCodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * @version 1.0
 * @Author shangjialu
 * @Date 2024/12/10 10:59
 * @注释
 */
@Service
public class VerificationCodeServiceImpl implements VerificationCodeService {

    // 对于redis里面的key需要标准化：为了区分业务，应该给key定义前缀：
    //向活动相关的获取信息，人员相关的活动信息，下面虽然手机号一样，但是对于活动业务就区分开了
    //防治一个key参加多种业务存储的value被替代
    // VerificationCode_13111111111:1233、User_13111111111:userInfo

    private static final String VERIFICATION_CODE_PREFIX = "VERIFICATION_CODE_";
    private static final Long VERIFICATION_CODE_TIMEOUT = 120L;
    private static final String VERIFICATION_CODE_TEMPLATE_CODE = "SMS_475795287";

    @Autowired
    private SMSUtil smsUtil;
    @Autowired
    private RedisUtil redisUtil;
    @Override
    public void sendVerificationCode(String phoneNumber) {
        //校验手机号
        if(!RegexUtil.checkMobile(phoneNumber)){
            throw new ServiceException(ServiceErrorCodeConstants.PHONE_NUMBER_ERROR);
        }
        //生成随机验证码 hutool里面的一个工具类完成验证码=随机生成
        String code = CaptchaUtil.getCaptcha(4);
        //发送验证码
        // {"code":"xxxx"},参数要求的是json格式的字符串，所以提前使用map进行包装
        Map<String, String> map = new HashMap<>();
        map.put("code", code);
        smsUtil.sendMessage(
                VERIFICATION_CODE_TEMPLATE_CODE,
                phoneNumber,
                JacksonUtil.writeValueAsString(map));//将string的map转为json格式的字符串
        //缓存验证码
        // 131xxxxxxxx: code 一个手机号对应一个验证码
        redisUtil.set(VERIFICATION_CODE_PREFIX + phoneNumber, code, VERIFICATION_CODE_TIMEOUT);
    }

    @Override
    public String getVerificationCode(String phoneNumber) {
        //校验手机号
        if(!RegexUtil.checkMobile(phoneNumber)){
            throw new ServiceException(ServiceErrorCodeConstants.PHONE_NUMBER_ERROR);
        }
        String result= redisUtil.get(VERIFICATION_CODE_PREFIX + phoneNumber);
        return result;
    }
}
